
#ifndef AUDIO_H
#define	AUDIO_H


#include <SDL/SDL.h>

#define FREQUENCE 44100     // Fréquence de restitution par défaut
#define FORMAT    AUDIO_S16 // Format des échantillons par défaut
#define NBCANAUX  2         // Nombre de canaux par défaut
#define AUDIOBUFF 2048      // Taille du buffer audio par défaut

#define NBMAX_SOURCES  50   // Nombre maximum de sources sur le lecteur
#define NBMAX_LECTURES 200  // Nombre maximum de lectures sur une source

// *************************************** Constantes utiles

// Statuts de lecteur et lecture :
#define STATUT_ERREUR 10
#define STATUT_STOP   11
#define STATUT_PLAY   12
#define STATUT_PAUSE  13
typedef int STATUT;

// Moment de libération de lecture :
#define LIBERE_MAINTENANT 21
#define LIBERE_ALAFIN     22
#define LIBERE_JAMAIS     23
typedef int LIBERE;

#define VRAI 1
#define FAUX 0
typedef int BOOLEAN;

// *************************************** LECTEUR

typedef struct Lecteur {
    SDL_mutex * mutex; // Verrou pour les données lues par le thread audio
    STATUT statut; // Etat du lecteur
    int frequence; // fréquence de restitution
    Uint16 format; // format des échantillons
    Uint8 nbcanaux; // nombre de canaux en sortie Lecteur
    int taille_bloc; // taille des blocs d'échantillons (calculé)
    Uint8 silence; // valeur du silence (calculé)
    // SOURCES ASSOCIEES AU LECTEUR :
    struct Source * sources[NBMAX_SOURCES];
    int nbs; // nombre de sources
} Lecteur;

// Initialisation : ouvre le périphérique audio conformément aux paramètres
void initLecteur(Lecteur * l, int _frequence, Uint16 _format, Uint8 _nbcanaux, Uint16 _taille_audiobuffer);

// Fermeture du péripherique audio
void closeLecteur(Lecteur * l);

// Activation du thread audio (la restitution démarre)
void restitution(Lecteur * l);

// Suspension du thread audio (la restitution est interrompue)
void suspension(Lecteur * l);

// Affichage des caractéristiques du lecteur :
void printLecteur(Lecteur * l);

// *************************************** SOURCE

typedef struct Source {
    BOOLEAN erreur; // problème de construction de la source
    Lecteur * lecteur; // lecteur chargé de la diffusion
    char * fichier; // nom du fichier wav
    Uint8 * buffer; // buffer des échantillons convertis
    int taille; // taille du buffer
    float duree; // durée du morceau en secondes
    // LECTURES ASSOCIEES A LA SOURCE :
    struct Lecture * lectures[NBMAX_LECTURES];
    int nbl; // nombre de lectures
} Source;

// Initialisation : charge et converti le fichier
void initSource(Source * s, Lecteur * _lecteur, char * _fichier);

// Libération de la source
void closeSource(Source * s);

// Affichage des caractéristiques de la source :
void printSource(Source * s);

// *************************************** LECTURE

typedef struct Lecture {
    Source * source; // source à lire
    STATUT statut; // indicateur de l'état de lecture
    LIBERE liberation; // instant de libération
    BOOLEAN repetition; // indicateur de lecture simple ou en boucle
    float volume; // volume (ratio du volume normal)
    float vitesse; // vitesse de lecture (ratio de la vitesse normale)
    float balance; // balance (ratio du volume du canal de droite)
    int taille_bloc; // taille des blocs d'echantillons
    int dernier_bloc; // indice du dernier bloc d'echantillon
    double position; // indice de lecture des BLOCS D'ECHANTILLONS
} Lecture;

// Création dynamique d'une lecture
Lecture * creerLecture(Source * _source, STATUT _statut, LIBERE _liberation, BOOLEAN _repetition, float _volume, float _vitesse, float _balance);

// Démarrage de la lecture
void lecture(Lecture * l);

// Suspension de la lecture
void pause(Lecture * l);

// Arrêt de la lecture (suspension + réinitialisation de position)
void stop(Lecture * l);

// Affichage des caractéristiques de la lecture :
void printLecture(Lecture * l);


#endif	/* AUDIO_H */

